/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.tubosmonterrey.cotizador.sql;

import com.tubosmonterrey.cotizador.sql.exceptions.NonexistentEntityException;
import com.tubosmonterrey.cotizador.sql.exceptions.PreexistingEntityException;
import com.tubosmonterrey.cotizador.tb.Tbclientes;
import java.io.Serializable;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import com.tubosmonterrey.cotizador.tb.Tbvendedores;
import com.tubosmonterrey.cotizador.tb.TbcotizacionTmp;
import java.util.ArrayList;
import java.util.Collection;
import com.tubosmonterrey.cotizador.tb.Tbcotizacion;

/**
 *
 * @author rsoberanis
 */
public class TbclientesJpaController implements Serializable {

    public TbclientesJpaController(EntityManagerFactory emf) {
        this.emf = emf;
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(Tbclientes tbclientes) throws PreexistingEntityException, Exception {
        if (tbclientes.getTbcotizacionTmpCollection() == null) {
            tbclientes.setTbcotizacionTmpCollection(new ArrayList<TbcotizacionTmp>());
        }
        if (tbclientes.getTbcotizacionCollection() == null) {
            tbclientes.setTbcotizacionCollection(new ArrayList<Tbcotizacion>());
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Tbvendedores vendedor = tbclientes.getVendedor();
            if (vendedor != null) {
                vendedor = em.getReference(vendedor.getClass(), vendedor.getId());
                tbclientes.setVendedor(vendedor);
            }
            Collection<TbcotizacionTmp> attachedTbcotizacionTmpCollection = new ArrayList<TbcotizacionTmp>();
            for (TbcotizacionTmp tbcotizacionTmpCollectionTbcotizacionTmpToAttach : tbclientes.getTbcotizacionTmpCollection()) {
                tbcotizacionTmpCollectionTbcotizacionTmpToAttach = em.getReference(tbcotizacionTmpCollectionTbcotizacionTmpToAttach.getClass(), tbcotizacionTmpCollectionTbcotizacionTmpToAttach.getId());
                attachedTbcotizacionTmpCollection.add(tbcotizacionTmpCollectionTbcotizacionTmpToAttach);
            }
            tbclientes.setTbcotizacionTmpCollection(attachedTbcotizacionTmpCollection);
            Collection<Tbcotizacion> attachedTbcotizacionCollection = new ArrayList<Tbcotizacion>();
            for (Tbcotizacion tbcotizacionCollectionTbcotizacionToAttach : tbclientes.getTbcotizacionCollection()) {
                tbcotizacionCollectionTbcotizacionToAttach = em.getReference(tbcotizacionCollectionTbcotizacionToAttach.getClass(), tbcotizacionCollectionTbcotizacionToAttach.getId());
                attachedTbcotizacionCollection.add(tbcotizacionCollectionTbcotizacionToAttach);
            }
            tbclientes.setTbcotizacionCollection(attachedTbcotizacionCollection);
            em.persist(tbclientes);
            if (vendedor != null) {
                vendedor.getTbclientesCollection().add(tbclientes);
                vendedor = em.merge(vendedor);
            }
            for (TbcotizacionTmp tbcotizacionTmpCollectionTbcotizacionTmp : tbclientes.getTbcotizacionTmpCollection()) {
                Tbclientes oldClienteOfTbcotizacionTmpCollectionTbcotizacionTmp = tbcotizacionTmpCollectionTbcotizacionTmp.getCliente();
                tbcotizacionTmpCollectionTbcotizacionTmp.setCliente(tbclientes);
                tbcotizacionTmpCollectionTbcotizacionTmp = em.merge(tbcotizacionTmpCollectionTbcotizacionTmp);
                if (oldClienteOfTbcotizacionTmpCollectionTbcotizacionTmp != null) {
                    oldClienteOfTbcotizacionTmpCollectionTbcotizacionTmp.getTbcotizacionTmpCollection().remove(tbcotizacionTmpCollectionTbcotizacionTmp);
                    oldClienteOfTbcotizacionTmpCollectionTbcotizacionTmp = em.merge(oldClienteOfTbcotizacionTmpCollectionTbcotizacionTmp);
                }
            }
            for (Tbcotizacion tbcotizacionCollectionTbcotizacion : tbclientes.getTbcotizacionCollection()) {
                Tbclientes oldClienteOfTbcotizacionCollectionTbcotizacion = tbcotizacionCollectionTbcotizacion.getCliente();
                tbcotizacionCollectionTbcotizacion.setCliente(tbclientes);
                tbcotizacionCollectionTbcotizacion = em.merge(tbcotizacionCollectionTbcotizacion);
                if (oldClienteOfTbcotizacionCollectionTbcotizacion != null) {
                    oldClienteOfTbcotizacionCollectionTbcotizacion.getTbcotizacionCollection().remove(tbcotizacionCollectionTbcotizacion);
                    oldClienteOfTbcotizacionCollectionTbcotizacion = em.merge(oldClienteOfTbcotizacionCollectionTbcotizacion);
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            if (findTbclientes(tbclientes.getId()) != null) {
                throw new PreexistingEntityException("Tbclientes " + tbclientes + " already exists.", ex);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(Tbclientes tbclientes) throws NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Tbclientes persistentTbclientes = em.find(Tbclientes.class, tbclientes.getId());
            Tbvendedores vendedorOld = persistentTbclientes.getVendedor();
            Tbvendedores vendedorNew = tbclientes.getVendedor();
            Collection<TbcotizacionTmp> tbcotizacionTmpCollectionOld = persistentTbclientes.getTbcotizacionTmpCollection();
            Collection<TbcotizacionTmp> tbcotizacionTmpCollectionNew = tbclientes.getTbcotizacionTmpCollection();
            Collection<Tbcotizacion> tbcotizacionCollectionOld = persistentTbclientes.getTbcotizacionCollection();
            Collection<Tbcotizacion> tbcotizacionCollectionNew = tbclientes.getTbcotizacionCollection();
            if (vendedorNew != null) {
                vendedorNew = em.getReference(vendedorNew.getClass(), vendedorNew.getId());
                tbclientes.setVendedor(vendedorNew);
            }
            Collection<TbcotizacionTmp> attachedTbcotizacionTmpCollectionNew = new ArrayList<TbcotizacionTmp>();
            for (TbcotizacionTmp tbcotizacionTmpCollectionNewTbcotizacionTmpToAttach : tbcotizacionTmpCollectionNew) {
                tbcotizacionTmpCollectionNewTbcotizacionTmpToAttach = em.getReference(tbcotizacionTmpCollectionNewTbcotizacionTmpToAttach.getClass(), tbcotizacionTmpCollectionNewTbcotizacionTmpToAttach.getId());
                attachedTbcotizacionTmpCollectionNew.add(tbcotizacionTmpCollectionNewTbcotizacionTmpToAttach);
            }
            tbcotizacionTmpCollectionNew = attachedTbcotizacionTmpCollectionNew;
            tbclientes.setTbcotizacionTmpCollection(tbcotizacionTmpCollectionNew);
            Collection<Tbcotizacion> attachedTbcotizacionCollectionNew = new ArrayList<Tbcotizacion>();
            for (Tbcotizacion tbcotizacionCollectionNewTbcotizacionToAttach : tbcotizacionCollectionNew) {
                tbcotizacionCollectionNewTbcotizacionToAttach = em.getReference(tbcotizacionCollectionNewTbcotizacionToAttach.getClass(), tbcotizacionCollectionNewTbcotizacionToAttach.getId());
                attachedTbcotizacionCollectionNew.add(tbcotizacionCollectionNewTbcotizacionToAttach);
            }
            tbcotizacionCollectionNew = attachedTbcotizacionCollectionNew;
            tbclientes.setTbcotizacionCollection(tbcotizacionCollectionNew);
            tbclientes = em.merge(tbclientes);
            if (vendedorOld != null && !vendedorOld.equals(vendedorNew)) {
                vendedorOld.getTbclientesCollection().remove(tbclientes);
                vendedorOld = em.merge(vendedorOld);
            }
            if (vendedorNew != null && !vendedorNew.equals(vendedorOld)) {
                vendedorNew.getTbclientesCollection().add(tbclientes);
                vendedorNew = em.merge(vendedorNew);
            }
            for (TbcotizacionTmp tbcotizacionTmpCollectionOldTbcotizacionTmp : tbcotizacionTmpCollectionOld) {
                if (!tbcotizacionTmpCollectionNew.contains(tbcotizacionTmpCollectionOldTbcotizacionTmp)) {
                    tbcotizacionTmpCollectionOldTbcotizacionTmp.setCliente(null);
                    tbcotizacionTmpCollectionOldTbcotizacionTmp = em.merge(tbcotizacionTmpCollectionOldTbcotizacionTmp);
                }
            }
            for (TbcotizacionTmp tbcotizacionTmpCollectionNewTbcotizacionTmp : tbcotizacionTmpCollectionNew) {
                if (!tbcotizacionTmpCollectionOld.contains(tbcotizacionTmpCollectionNewTbcotizacionTmp)) {
                    Tbclientes oldClienteOfTbcotizacionTmpCollectionNewTbcotizacionTmp = tbcotizacionTmpCollectionNewTbcotizacionTmp.getCliente();
                    tbcotizacionTmpCollectionNewTbcotizacionTmp.setCliente(tbclientes);
                    tbcotizacionTmpCollectionNewTbcotizacionTmp = em.merge(tbcotizacionTmpCollectionNewTbcotizacionTmp);
                    if (oldClienteOfTbcotizacionTmpCollectionNewTbcotizacionTmp != null && !oldClienteOfTbcotizacionTmpCollectionNewTbcotizacionTmp.equals(tbclientes)) {
                        oldClienteOfTbcotizacionTmpCollectionNewTbcotizacionTmp.getTbcotizacionTmpCollection().remove(tbcotizacionTmpCollectionNewTbcotizacionTmp);
                        oldClienteOfTbcotizacionTmpCollectionNewTbcotizacionTmp = em.merge(oldClienteOfTbcotizacionTmpCollectionNewTbcotizacionTmp);
                    }
                }
            }
            for (Tbcotizacion tbcotizacionCollectionOldTbcotizacion : tbcotizacionCollectionOld) {
                if (!tbcotizacionCollectionNew.contains(tbcotizacionCollectionOldTbcotizacion)) {
                    tbcotizacionCollectionOldTbcotizacion.setCliente(null);
                    tbcotizacionCollectionOldTbcotizacion = em.merge(tbcotizacionCollectionOldTbcotizacion);
                }
            }
            for (Tbcotizacion tbcotizacionCollectionNewTbcotizacion : tbcotizacionCollectionNew) {
                if (!tbcotizacionCollectionOld.contains(tbcotizacionCollectionNewTbcotizacion)) {
                    Tbclientes oldClienteOfTbcotizacionCollectionNewTbcotizacion = tbcotizacionCollectionNewTbcotizacion.getCliente();
                    tbcotizacionCollectionNewTbcotizacion.setCliente(tbclientes);
                    tbcotizacionCollectionNewTbcotizacion = em.merge(tbcotizacionCollectionNewTbcotizacion);
                    if (oldClienteOfTbcotizacionCollectionNewTbcotizacion != null && !oldClienteOfTbcotizacionCollectionNewTbcotizacion.equals(tbclientes)) {
                        oldClienteOfTbcotizacionCollectionNewTbcotizacion.getTbcotizacionCollection().remove(tbcotizacionCollectionNewTbcotizacion);
                        oldClienteOfTbcotizacionCollectionNewTbcotizacion = em.merge(oldClienteOfTbcotizacionCollectionNewTbcotizacion);
                    }
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                String id = tbclientes.getId();
                if (findTbclientes(id) == null) {
                    throw new NonexistentEntityException("The tbclientes with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(String id) throws NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Tbclientes tbclientes;
            try {
                tbclientes = em.getReference(Tbclientes.class, id);
                tbclientes.getId();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The tbclientes with id " + id + " no longer exists.", enfe);
            }
            Tbvendedores vendedor = tbclientes.getVendedor();
            if (vendedor != null) {
                vendedor.getTbclientesCollection().remove(tbclientes);
                vendedor = em.merge(vendedor);
            }
            Collection<TbcotizacionTmp> tbcotizacionTmpCollection = tbclientes.getTbcotizacionTmpCollection();
            for (TbcotizacionTmp tbcotizacionTmpCollectionTbcotizacionTmp : tbcotizacionTmpCollection) {
                tbcotizacionTmpCollectionTbcotizacionTmp.setCliente(null);
                tbcotizacionTmpCollectionTbcotizacionTmp = em.merge(tbcotizacionTmpCollectionTbcotizacionTmp);
            }
            Collection<Tbcotizacion> tbcotizacionCollection = tbclientes.getTbcotizacionCollection();
            for (Tbcotizacion tbcotizacionCollectionTbcotizacion : tbcotizacionCollection) {
                tbcotizacionCollectionTbcotizacion.setCliente(null);
                tbcotizacionCollectionTbcotizacion = em.merge(tbcotizacionCollectionTbcotizacion);
            }
            em.remove(tbclientes);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<Tbclientes> findTbclientesEntities() {
        return findTbclientesEntities(true, -1, -1);
    }

    public List<Tbclientes> findTbclientesEntities(int maxResults, int firstResult) {
        return findTbclientesEntities(false, maxResults, firstResult);
    }

    private List<Tbclientes> findTbclientesEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(Tbclientes.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public Tbclientes findTbclientes(String id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Tbclientes.class, id);
        } finally {
            em.close();
        }
    }

    public int getTbclientesCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<Tbclientes> rt = cq.from(Tbclientes.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
    
}
